package cn.com.yx.ms.service;


import cn.com.yx.ms.application.web.ApiQueryBase;
import cn.com.yx.ms.domain.dbmodel.DevEquStore;
import cn.com.yx.ms.domain.dbmodel.DevImg;
import cn.com.yx.ms.domain.dbmodel.DevVersionRecord;
import cn.com.yx.ms.domain.dev.*;
import cn.com.yx.ms.domain.program.CatalogModel;
import cn.yx.framework.configuration.ApiCode;
import cn.yx.framework.view.ApiResult;

import java.util.List;

/**
 * 公告管理
 */
public interface IDevService {

    //region << 设备目录 >>

    /**
     * 设备目录保存或更新操作方法
     *
     * @param catalogModel
     * @return
     */
    ApiResult saveDevCatalog(CatalogModel catalogModel);

    /**
     * 新增设备目录
     *
     * @param catalogModel
     * @return
     */
    int insertDevCatalog(CatalogModel catalogModel);

    /**
     * 删除设备目录
     *
     * @param id
     * @return
     */
    ApiResult deleteDevCatalog(String id);


    /**
     * 修改设备目录
     *
     * @param catalogModel
     * @return
     */
    int updateDevCatalog(CatalogModel catalogModel);

    /**
     * 查询设备目录
     *
     * @param apiQueryBase
     * @return
     */
    List<CatalogModel> findDevCatalogs(ApiQueryBase apiQueryBase);

    /**
     * 获取单个设备目录对象
     *
     * @param id
     * @return
     */
    CatalogModel findDevCatalog(String id);

    //endregion

    // region << 设备管理 >>

    /**
     * 设备保存或更新操作方法
     *
     * @param devModel
     * @return
     */
    ApiResult saveDev(DevModel devModel);

    /**
     * 设备保存或更新操作方法
     *
     * @param devChannelModel
     * @return
     */
    ApiCode saveDevChannel(DevChannelModel devChannelModel);

    ApiResult findDevChannel(String devsn);

    /**
     * 新增设备
     *
     * @param devModel
     * @return
     */
    int insertDev(DevModel devModel);

    /**
     * 删除设备
     *
     * @param id
     * @return
     */
    int deleteDev(String id);

    /**
     * 修改设备
     *
     * @param devModel
     * @return
     */
    int updateDev(DevModel devModel);

    /**
     * 查询设备
     *
     * @param apiQueryBase
     * @return
     */
    List<DevEquStore> findDevs(ApiQueryBase apiQueryBase);

    /**
     * 获取单个设备对象
     *
     * @param id
     * @return
     */
    DevModel findDev(String id);

    // endregion

    // region << 设备监控 >>

    /**
     * 获取设备全属性集合
     *
     * @param apiQueryBase
     * @return
     */
    List<DevCompleteInfoModel> findCompleteInfoModel(ApiQueryBase apiQueryBase);

    /**
     * 获取设备位置信息
     *
     * @param apiQueryBase
     * @return
     */
    List<DevPositionModel> findDevPositionModel(ApiQueryBase apiQueryBase);

    /**
     * 获取告警设备信息
     *
     * @return
     */
    List<DevPositionAlertModel> findDevPositionAlerts();

    /**
     * 获取所有设备位置信息
     *
     * @return
     */
    List<DevPositionModel> findDevPositionModels();

    /**
     * 获取单个设备全属性集合
     *
     * @param devsn
     * @return
     */
    DevCompleteInfoModel findOneDevCompleteModel(String devsn);

    /**
     * 获取设备截屏
     *
     * @param devsn
     * @return
     */
    DevImg findDevImg(String devsn);

    DevOnlineCountModel findOnlineOfflineCount();
    // endregion

    // region << 虚拟目录 >>

    /**
     * 获取物理设备目录树结构
     *
     * @return
     */
    List<DevTreeModel> findDevTreeNodes();

    /**
     * 获取设备目录
     *
     * @return
     */
    List<DevTreeModel> findDevTreeNodesWithStyleName();

    /**
     * 获取虚拟设备目录结构
     *
     * @return
     */
    List<DevTreeModel> findDevVirtualTreeNodes();

    /**
     * 获取虚拟设备目录结构
     *
     * @return
     */
    List<DevTreeModel> findDevVirtualTreeNodesWithStyle();

    /**
     * 根据式样id获取虚拟设备目录
     * @param styleid
     * @return
     */
    List<DevTreeModel> findDevVirtualTreeNodesWithStyle(String styleid);

    /**
     * 保存虚拟目录树
     *
     * @param devTreeModels
     * @return
     */
    ApiResult saveVirtualDev(List<DevTreeModel> devTreeModels);

    // endregion

    // region << 设备升级 >>

    ApiResult saveDevVersionRecord(String version, String updatePackageName);

    int insertDevVersionRecord(DevVersionRecord devVersionRecord);

    /**
     * 删除升级包
     *
     * @param id
     * @return
     */
    int deleteUpdatePackage(String id);


    int updateDevVersionRecord(DevVersionRecord devVersionRecord);

    List<DevVersionRecord> findDevVersionRecord(ApiQueryBase query);

    List<UpDevUpdateLogModel> findUpDevUpdateLogs(ApiQueryBase query);

    // endregion

    // region << 设备同步 >>

    List<DevTemplate> findDevTemplates(String devid, String styleid);

    /**
     * 获取设备编号和式样ID
     */
    EquipmentNoAndStyleIdModel findEquipmentNoAndStyleId(String uniqueNo) throws Exception;

    /**
     * 同步单个设备，式样ID，是否同时推送websocket
     *
     * @param devid
     * @param styleid
     * @param isSendWs
     * @param sendWsType (-1-全部同步 | 0-媒体 | 1-公告 | 2-线路)
     * @return
     * @throws Exception
     */
    ApiCode syncDevTemplate(String devid, String styleid, boolean isSendWs, int sendWsType) throws Exception;

    ApiCode syncDevTemplate(String devid, String styleid, String isDeleteLocalResource) throws Exception;


    /**
     * 模板ZIP推送
     *
     * @param devid
     * @return
     */
    ApiCode htmlZipPush(String devid, String styleid, String isDeleteLocalResource) throws Exception;

    /**
     * 根据设备编号查找设备升级日志
     *
     * @param devsn
     * @return
     */
    List<DevUpdateReplayProgress> findDevUpdateReplayProgress(String devsn);

    ApiCode saveEqusByMove(List<CatalogModel> catalogModels);
    // endregion

    // region << 设备告警 >>

    List<DevAlertInfoModel> findDevAlertInfos(ApiQueryBase query);

    int findDevAlertCount();

    ApiCode revokeAlerts(List<DevAlertInfoModel> list);
    // endregion

}